CloudFormationのスタックを間違えて上書きデプロイしちゃったので、対策としてスタックの命名を自動化した
先日、既存のCloudFormationスタックを間違えて上書きデプロイしてしまいました。気づいたときには後の祭りです(再デプロイで復旧しました)。
そこで今回は、発生したことの整理と対策を考えてみました。
前提
リポジトリとCloudFormation(AWS SAM)のスタックは次のような関係です。
- AWS SAMのテンプレートファイルを使用していた
- 1つのリポジトリに対して、1つのCloudFormationスタックを作る
発生したこと
単純なミスでした。でも怖い……。
- 新しいリポジトリ
Repository-X
を作成した - 既存リポジトリ
Repository-A
のデプロイコマンドをコピーした - このとき、デプロイコマンドのスタック名が
Repository-A-Stack
となっていた(★修正漏れ) - これに気づかず、新規作成した
Repository-X
リポジトリをRepository-A-Stack
としてデプロイしてしまった - 結果として、
Repository-A
のデプロイ内容がRepository-X
で上書きデプロイされてしまった
デプロイコマンド
AWS SAMテンプレートをデプロイするとき、次のようなMakefile
を作成し、make deploy
コマンドを実行しています。
ご覧のとおり、--stack-name Repository-A-Stack
と直接指定されていたのを見落としていました。
deploy: sam package \ --output-template-file packaged.yaml \ --s3-bucket any-bucket-name sam deploy \ --template-file packaged.yaml \ --stack-name Repository-A-Stack \ --capabilities CAPABILITY_NAMED_IAM \ --no-fail-on-empty-changeset \ --parameter-overrides xxx=aaa
対策案
デプロイコマンドにスタック名が埋め込まれていたことに気づけませんでした。というわけで、対策方針は2つです。
- スタック名を変数化して分かりやすくする
- スタック名を自動で命名する
スタック名を変数化して分かりやすくする
スタック名の変数をMakefile
の先頭に明記することで、気付けるようにしました。
STACK_NAME := Repository-X-Stack deploy: sam package \ --output-template-file packaged.yaml \ --s3-bucket any-bucket-name sam deploy \ --template-file packaged.yaml \ --stack-name $(STACK_NAME) \ --capabilities CAPABILITY_NAMED_IAM \ --no-fail-on-empty-changeset \ --parameter-overrides xxx=aaa
スタック名を自動で命名する
スタック名を「カレントディレクトリ名」にすることで、リポジトリと同じ名前にします。これにより、スタック名を気にすることなくデプロイできます。(リポジトリ名の重複は無いもとのして考えます)
pwd
コマンドでカレントディレクトリパスを取得し、basename
でカレントディレクトリ名を取得しています。
deploy: sam package \ --output-template-file packaged.yaml \ --s3-bucket any-bucket-name sam deploy \ --template-file packaged.yaml \ --stack-name $$(basename `pwd`)-Stack \ --capabilities CAPABILITY_NAMED_IAM \ --no-fail-on-empty-changeset \ --parameter-overrides xxx=aaa
さいごに
やらかしたのが開発環境で良かったです。スタック名の自動命名は初めて試しましたが、良い感じではないでしょうか。今後は取り入れてみたいと思います。